// 系统后端方法

package api

import (
    "fmt"
    "bytes"

    "net/http"
    "io/ioutil"
    "encoding/json"

    "tokyo/common"
    "tokyo/core"
)


// 系统后端维护一个已完成题目序号切片
var done = [] int {}

// 验证答案，并广播通知节点
func VerifyAnswer(answer common.Answer)  {
    answerDark := core.GetHashCode(answer.Answer)
    seq := answer.Seq
    // 如果题目已完成，直接退出函数
    for _, v := range done {
        if v == seq {
            return
        }
    }

    if answerDark == answer.DarkText {
        fmt.Println("验证通过！")
        // 记录该题目
        done = append(done, seq)

        // 定义请求体
        var testRes common.TestResult
        testRes.Seq = seq
        testRes.AuthorIP = answer.NodeIp

        // 广播通知考试结果
        for _, v := range common.NodeArray[:common.NodeCount] {
            // 定义请求地址
            url := fmt.Sprintf("http://%s:8080/get_result", v)

            // 定义content_type
            contentType := "application/json"

            // 序列化成reader
            b, _ := json.Marshal(testRes)
            reader := bytes.NewReader(b)

            // 发送请求
            resp, err := http.Post(url, contentType, reader)
            if err != nil {
                fmt.Println("发送请求失败")
                fmt.Println(err.Error())
                continue
            }

            // 获取响应
            respByte, _ := ioutil.ReadAll(resp.Body)
            respStr := string(respByte)
            if respStr == "success" {
                fmt.Println(v, "广播成功！")
            }
        }
    }
}
